package com.tianji.promotion.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tianji.common.domain.dto.PageDTO;
import com.tianji.promotion.domain.dto.UserCouponDTO;
import com.tianji.promotion.domain.po.UserCoupon;
import com.tianji.promotion.domain.query.UserCouponQuery;
import com.tianji.promotion.domain.vo.CouponVO;

import java.util.List;

/**
 * <p>
 * 用户领取优惠券的记录，是真正使用的优惠券信息 服务类
 * </p>
 *
 * @author zr
 * @since 2024-08-01
 */
public interface IUserCouponService extends IService<UserCoupon> {

    /**
     * 接收优惠券方法
     * 该方法用于用户接收特定的优惠券
     * 通过此方法，用户可以将优惠券添加到自己的优惠券列表中
     *
     * @param couponId 优惠券ID，用于标识特定的优惠券
     */
    void receiveCoupon(Long couponId);

    /**
     * 兑换优惠券
     * <p>
     * 根据提供的优惠券兑换码，查找并应用相应的优惠券
     *
     * @param code 优惠券代码，用于识别和匹配特定的优惠条件
     */
    void exchangeCoupon(String code);

//    void checkAndCreateUserCoupon(Coupon coupon, Long userId, Long serialNum);

    /**
     * 查询个人优惠券页面
     * <p>
     * 此方法用于根据用户查询条件分页查询用户优惠券信息
     * 它提供了一个接口，用于在用户模块中查询个人优惠券的分页数据
     * 主要用于前端展示用户优惠券列表
     *
     * @param query 用户优惠券查询条件，包括用户ID、优惠券状态等
     * @return 返回一个PageDTO对象，包含满足查询条件的用户优惠券信息分页数据
     */
    PageDTO<CouponVO> queryMyCouponPage(UserCouponQuery query);

    void checkAndCreateUserCoupon(UserCouponDTO uc);

    /**
     * 批量核销用户优惠券
     *
     * @param userCouponIds 需要核销的用户优惠券ID列表
     */
    void writeOffCoupon(List<Long> userCouponIds);

    /**
     * 退款指定的优惠券
     *
     * @param userCouponIds 用户优惠券的ID列表，用于标识需要退款的具体优惠券
     */
    void refundCoupon(List<Long> userCouponIds);

    /**
     * 根据用户优惠券ID列表查询对应的折扣规则
     * <p>
     * 此方法主要用于检索特定用户拥有的优惠券的折扣规则详细信息它提供了一种根据用户已有的优惠券
     * 来获取相应折扣规则
     *
     * @param userCouponIds 用户优惠券ID列表，该列表包含了用户拥有的优惠券ID
     * @return 返回一个字符串列表，每个字符串代表一条折扣规则
     */
    List<String> queryDiscountRules(List<Long> userCouponIds);
}
